//==========================================================================
// Copyright (c) 2000-2008,  Elastos, Inc.  All Rights Reserved.
//==========================================================================
#ifndef __HOOK_H__
#define __HOOK_H__

//#include <stdio.h>
//#include <assert.h>

//#define _DBGHOOK

#define IsInValidHook(x)  (((x) < 0) ||((x) >= MAX_ITEMS))

typedef void (*HOOKPROC)(int id, int nCode, void *pParam);

typedef struct {
//    ListNode m_Link;
    void * m_Proc;
}HOOKNODE;

class Hook
{
public:
    Hook(int MaxItem=32);
    ~Hook(void);

    int     Set(int id, const void *pHookProc);
    int     Unhook(int id);
    void    CallNext(int id, int nCode, void *pParam);
#if defined(_DBGHOOK)
    void    Dump(void);
#endif

private:
    const int MAX_ITEMS;// The actual items
    HOOKNODE *Chain;    // The actual hook array
};

#endif /*__HOOK_H__*/
